package by.grsu.hdm;

import java.util.ArrayList;
import java.util.List;

import by.grsu.hdm.devices.MediaCenter;
import by.grsu.hdm.devices.MediaPlayer;
import by.grsu.hdm.devices.NetworkMonitor;
import by.grsu.hdm.devices.RemoteControl;
import by.grsu.hdm.devices.UsbFlashDrive;
import by.grsu.hdm.devices.WashingMachine;
import by.grsu.hdm.exceptions.NotSupportUsbException;
import by.grsu.hdm.media.Audio;
import by.grsu.hdm.media.Video;
import by.grsu.hdm.model.IDevice;
import by.grsu.hdm.model.IHomeDevice;
import by.grsu.hdm.model.INetworkAvailable;
import by.grsu.hdm.model.IUsbPort;
import by.grsu.hdm.model.IUsbSupport;
import by.grsu.hdm.reporting.TextReportBuilder;
import by.grsu.hdm.reporting.TrafficReportData;

public class HomeDeviceManagerStarter {

	// надо разбить на логический функционально законченные методы
	public static void main(String[] args) {

		List<IHomeDevice> devices = new ArrayList<IHomeDevice>();
		MediaPlayer mediaPlayer = new MediaPlayer();
		RemoteControl remoteControl = new RemoteControl();

		MediaCenter media = new MediaCenter("MEDIA#132456", mediaPlayer, remoteControl);

		try {
			// текстовые константы...
			media.getUsbPort().connectDevice(new UsbFlashDrive("FLASH-4GB"));
		} catch (NotSupportUsbException e) {
			// тут может быть либо логирование либо пробразывание наверх эксепшена. В классе с сервлетом я писал подробней про эксепшены
			e.printStackTrace();
		}

		devices.add(media);
		devices.add(new WashingMachine("WASHING#45"));

		// turn all devices on..
		for (IHomeDevice device : devices) {
			device.turnOn();
		}

		// check for connected devices
		for (IDevice device : devices) {
			if (device instanceof IUsbSupport) {
				IUsbPort usb = ((IUsbSupport) device).getUsbPort();
				if (usb.hasConnectedDevice()) {
					IDevice usbDevice = usb.getConnectedDevice();
					if (usbDevice != null)
						System.out.println(usbDevice.getDeviceId() + " is connected to " + device.getDeviceId());
				}
			}
		}

		// register devices for network monitoring
		NetworkMonitor monitor = new NetworkMonitor();

		for (IDevice device : devices) {
			if (device instanceof INetworkAvailable) {
				monitor.registerDevice((INetworkAvailable) device);
			}
		}

		TrafficReportData reportData = monitor.getNetworkStatistics();

		TextReportBuilder text = new TextReportBuilder(reportData);
		String report = text.buildReport();

		// надо посмотреть что такое логирование (Log4J) и в своем проекте
		// слудующем использовать ТОЛЬКО LOGGER и никогда не использовать
		// System.out. В данном сулчае это ок так как вы тренировались на
		// консольном проекте. Но дальше про System.out надо забывать
		System.out.println(report);

		Audio song = new Audio("1", "Are you ready", "Three Days Grace", 200);
		Video film = new Video("2", "A Walk To Remember", 2000);
		if (media.getMediaPlayer() != null) {
			media.getMediaPlayer().playMedia(song);
			media.getMediaPlayer().playMedia(film);
		}
		if (media.getRemoteControl() != null) {
			media.getRemoteControl().pause();
		}

		// turn all devices off..
		for (IHomeDevice device : devices) {
			device.turnOff();
		}
	}

}
